import numpy as np
from PIL import Image
import os
import logging


def load_image(file_path, as_gray=False):
    """
    加载图像文件并转换为numpy数组
    
    参数:
        file_path: 图像文件路径
        as_gray: 是否以灰度模式加载
    
    返回:
        numpy数组，表示加载的图像
    """
    try:
        if not os.path.exists(file_path):
            raise FileNotFoundError(f"文件不存在: {file_path}")
        
        img = Image.open(file_path)
        
        if as_gray:
            img = img.convert('L')
        
        img_array = np.array(img)
        
        logging.info(f"成功加载图像: {file_path}, 形状: {img_array.shape}, 类型: {img_array.dtype}")
        return img_array
    except Exception as e:
        logging.error(f"加载图像失败: {file_path}, 错误: {str(e)}")
        raise


def save_image(image, file_path):
    """
    将numpy数组保存为图像文件
    
    参数:
        image: numpy数组，表示图像
        file_path: 保存路径
    """
    try:
        # 确保图像数据在正确的范围内
        if image.dtype != np.uint8:
            if image.max() > 255 or image.min() < 0:
                # 归一化到0-255
                image = (image - image.min()) / (image.max() - image.min()) * 255
            image = image.astype(np.uint8)
        
        img = Image.fromarray(image)
        img.save(file_path)
        
        logging.info(f"成功保存图像: {file_path}")
    except Exception as e:
        logging.error(f"保存图像失败: {file_path}, 错误: {str(e)}")
        raise